#include "TComando.h"

int Comando_Crear(TComando* comando, int longitud_maxima) {
	comando->operacion = (char*) malloc(longitud_maxima);
	comando->longitud_maxima = longitud_maxima;

	if ((comando != NULL) && (comando->operacion != NULL))
		return COMANDO_OK;
	else
		return COMANDO_ERR_MEMORIA;
}

int Comando_Destruir(TComando* comando) {
	int i;

	/*free(comando->operacion);*/

	for (i = 0; i < comando->cantidad_argumentos; i++) {
		free(comando->argumentos[i]);
	}

	return COMANDO_OK;
}

/* TODO: que aprenda a reconocer comillas y a meter lo que esta entre ellas en un solo argumento/string */
void parsear_argumentos(TComando* comando, char* argumentos) {
	int posicion_actual, posicion_inicial, indice_argumento, length, n, i;
	char caracter;

	length = strlen(argumentos);
	posicion_actual = indice_argumento = posicion_inicial = 0;
	caracter = argumentos[posicion_actual];

	while (caracter != '\0') {
		caracter = argumentos[posicion_actual];
		while ((caracter != ' ') && (caracter != '\0')) {
			caracter = argumentos[++posicion_actual];
		}
		n = posicion_actual - posicion_inicial;
		comando->argumentos[indice_argumento] = malloc(n);
		strncpy(comando->argumentos[indice_argumento], argumentos, n);
		posicion_inicial = ++posicion_actual;
		indice_argumento++;
	}

	comando->cantidad_argumentos = indice_argumento;

	if (COMANDO_DEBUG) {
		printf("parsear_argumentos:\n comando->cantidad_argumentos = %d\n", comando->cantidad_argumentos);
		for (i = 0; i < comando->cantidad_argumentos; i++) {
			printf(" comando->argumentos[%d] = %s\n", i, comando->argumentos[i]);
		}
	}
}

int Comando_Leer(TComando* comando) {
	char operacion[LONGITUD_MAXIMA];
	char argumentos[LONGITUD_MAXIMA];
	char entrada[LONGITUD_MAXIMA];

	printf("%c ", PROMPT_CHAR);
	scanf("%s", operacion);
/*	sscanf(entrada, "%s", operacion);*/
	comando->operacion = operacion;
	/* Workaround para poder aceptar operaciones sin parametros */
	if (strcasecmp(operacion, "RECV") && strcasecmp(operacion, "QUIT") && strcasecmp(operacion, "HELP")) {
	    scanf ("%[A-Z, a-z, 0-9, ]",argumentos);
		/*sscanf(entrada, "%s %[A-Z, a-z, 0-9, ]", operacion, argumentos);*/
		parsear_argumentos(comando, argumentos);
	}

	return COMANDO_OK;
}

int Comando_ObtenerOperacion(TComando* comando, char** operacion) {
	*operacion = comando->operacion;
	return COMANDO_OK;
}

int Comando_ObtenerArgumentos(TComando* comando, int indice, char** argumentos) {
	*argumentos = comando->argumentos[indice];
	return COMANDO_OK;
}

